# -*- coding: utf-8 -*-
from clasesPrincipales.ManagerInterruptor import Signal
from queue import Queue

class RR():
###############################################################################################################

    # INICIALIZACION & PRINT

    def __init__(self, timeQuantum):
        self.ready = Queue () # contiene los procesos listos
        self.quantum = timeQuantum # tiempo de CPU
        self.currentTask = None #tarea actual
        self.manager = None

    def __repr__(self):
        # Imprime las listas
        return ('Politica utilizada: Round Robin' )
    
###############################################################################################################

    # OPERATIONS
    def actualTask(self):
        # Recupera la tarea actualmente activa
        return self.currentTask

    def nextTask(self):
        # Trae la siguiente tarea. 
        pcb = self.ready.get() # guarda la tarea, y la elimina de la cola
        self.currentTask = pcb
        return pcb

    def addTask(self, aTask):
        # Agrega una tarea a la cola de listos
        self.ready.put(aTask)
        
    def killTask(self):
        # Elimina la tarea actualmente activa. 
        self.currentTask = None

    def hasNext(self):
        # Pregunta si existe una siguiente tarea
        return self.ready.qsize()> 0
    
    def listenCicloCpu(self):
        self.incrementarQuantum()
        if self.currentTask.pcbQuantum == self.quantum:
            self.currentTask.pcbQuantum = 0
            self.manager.interrupcion(Signal.TIMER)
###############################################################################################################
    #GET&SET  
    def setManager(self, manager):
        self.manager = manager
    def getReady (self):
        return self.ready
    def setReady(self, readys):
        self.ready = readys    
    def getQuantum (self):
        return self.quantum
    def setQuantum (self, newQuantum):
        self.quantum = newQuantum
    def incrementarQuantum (self):
        self.currentTask.pcbQuantum  = self.currentTask.pcbQuantum  + 1